#!/usr/bin/python

import sys
from gi.repository import GObject as gobject

import dbus
import dbus.service
import dbus.mainloop.glib

def make_bytes_readable(bytes):
	SUFFIXES = [ 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB' ]
	size = 1024

	if bytes < size:
		return ''

	for suffix in SUFFIXES:
		if bytes > size * 1024:
			size = size * 1024
			continue

		return '%.1f %s' % (bytes / float(size), suffix)

	return ''

def print_stats(stats):
	keys = stats.keys()
	keys.sort()

	for key in keys:
		val = int(stats[key])
		str = "    %s = %s" % (key, val)

		if key in ["RX.Bytes", "TX.Bytes"]:
			hstr = make_bytes_readable(val)
			if hstr:
				str = "%s (%s)" % (str, hstr)

		print str

class Counter(dbus.service.Object):
	@dbus.service.method("net.connman.Counter",
				in_signature='', out_signature='')
	def Release(self):
		print("Release")
		mainloop.quit()

	@dbus.service.method("net.connman.Counter",
				in_signature='oa{sv}a{sv}', out_signature='')
	def Usage(self, path, home, roaming):
		print "%s" % (path)

		if len(home) > 0:
			print "  Home"
			print_stats(home)
		if len(roaming) > 0:
			print "  Roaming"
			print_stats(roaming)

if __name__ == '__main__':
	dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

	bus = dbus.SystemBus()
	manager = dbus.Interface(bus.get_object('net.connman', "/"),
					'net.connman.Manager')

	period = 2
	if len(sys.argv) > 1:
		period = sys.argv[1]

	path = "/test/counter%s" % period
	object = Counter(bus, path)

	manager.RegisterCounter(path, dbus.UInt32(10), dbus.UInt32(period))

	mainloop = gobject.MainLoop()
	mainloop.run()

	#manager.UnregisterCounter(path)
